home *** CD-ROM | disk | FTP | other *** search
- #include "GenerateIndex.h"
-
- extern struct WBStartup *_WBMsg;
- extern void _waitwbmsg(void);
-
- const UBYTE VersTag[] = "$VER: GenerateIndex " VERSION " (" DATE ")";
-
- const UBYTE Template[] = "FROM/M,TO,SETTINGS,"
- "RECURSIVELY/S,KEEPEMPTY/S,UNRECOGAREDOCS/S,"
- "AUTODOC/S,"
- "C/S,C_DEFINE/S,C_STRUCT/S,C_TYPEDEF/S,"
- "E/S,E_CONST/S,E_OBJECT/S,E_PROC/S,"
- "ASM/S,ASM_EQU/S,ASM_STRUCTURE/S,ASM_MACRO/S";
-
- const UBYTE CLI_Help[] = "\n"
- "GenerateIndex [[FROM] {wildcard}] [TO <file>] [SETTINGS <file>]\n"
- "\t[RECURSIVELY] [KEEPEMPTY] [UNRECOGAREDOCS]\n"
- "\t[AUTODOC]\n"
- "\t[C] [C_DEFINE] [C_STRUCT] [C_TYPEDEF]\n"
- "\t[E] [E_CONST] [E_OBJECT] [E_PROC]\n"
- "\t[ASM] [ASM_EQU] [ASM_STRUCTURE] [ASM_MACRO]\n"
- "\n"
- "- Not specifying FROM will open the GUI (ReqTools and Triton required)\n"
- "- A script is handy for Shell usage\n"
- "- Study the guide for more information\n"
- "\n";
-
- /* Structure for ReadArgs() to return parsed arguments into */
- struct {
- STRPTR (*From)[];
- STRPTR To;
- STRPTR Settings;
- LONG Recursively, KeepEmpty, UnrecogAreDocs;
- LONG AutoDoc;
- LONG C_Active, C_Define, C_Struct, C_Typedef;
- LONG E_Active, E_Const, E_Object, E_Proc;
- LONG Asm_Active, Asm_Equ, Asm_Structure, Asm_Macro;
- } StartupArgs;
-
- struct List FileList, EmptyList;
- struct RDArgs *Args;
- struct ReqToolsBase *ReqToolsBase;
-
- /// _main() -- handle parsing of WB/Shell arguments
- __stkargs LONG
- _main(LONG argc, STRPTR argv)
- {
- ReqToolsBase = OpenLibrary("reqtools.library", 38);
-
- /* This will initialize the list and create a pool */
- InitializeFileList();
- NewList(&EmptyList);
-
- if (_WBMsg)
- {
- struct DiskObject *diskobj;
-
- CurrentDir(_WBMsg->sm_ArgList->wa_Lock);
- if (diskobj = GetDiskObject(_WBMsg->sm_ArgList->wa_Name))
- {
- STRPTR arg;
-
- if (arg = FindToolType(diskobj->do_ToolTypes, "TO"))
- strncpy(DataName, arg, 255);
-
- /* Load specified or default settings file */
- arg = FindToolType(diskobj->do_ToolTypes, "SETTINGS");
- LoadSettings(arg ? arg : (STRPTR)"ENV:FetchRefs_GI.prefs");
-
- /* Release icon again */
- FreeDiskObject(diskobj);
-
- /* Open GUI */
- GoGUI();
- } else
- CloseAll(IoErr());
- } else
- {
- if (Args = AllocDosObject(DOS_RDARGS, NULL))
- {
- /* Activate extended help */
- Args->RDA_ExtHelp = CLI_Help;
-
- /* Parse arguments */
- StartupArgs.From = (APTR)1;
- if (ReadArgs(Template, (LONG *)&StartupArgs, Args))
- {
- /* Minor hack to help PostMessage() */
- if (StartupArgs.From == (APTR)1)
- StartupArgs.From = NULL;
-
- /* Do not bother to start if the user pressed CTRL-C during
- * load time or during a 'GenerateIndex ?' help session.
- */
- if (CheckSignal(SIGBREAKF_CTRL_C))
- CloseAll(0);
-
- /* Set options */
- if (StartupArgs.Settings)
- LoadSettings(StartupArgs.Settings);
- else
- {
- if (StartupArgs.AutoDoc)
- Settings.AutoDocPrf.Active = TRUE;
-
- if (StartupArgs.C_Active)
- Settings.CPrf.Active = TRUE;
- if (StartupArgs.C_Define)
- Settings.CPrf.Define = TRUE;
- if (StartupArgs.C_Struct)
- Settings.CPrf.Struct = TRUE;
- if (StartupArgs.C_Typedef)
- Settings.CPrf.Typedef = TRUE;
-
- if (StartupArgs.E_Active)
- Settings.EPrf.Active = TRUE;
- if (StartupArgs.E_Const)
- Settings.EPrf.Const = TRUE;
- if (StartupArgs.E_Object)
- Settings.EPrf.Object = TRUE;
- if (StartupArgs.E_Proc)
- Settings.EPrf.Proc = TRUE;
-
- if (StartupArgs.Asm_Active)
- Settings.AsmPrf.Active = TRUE;
- if (StartupArgs.Asm_Equ)
- Settings.AsmPrf.Equ = TRUE;
- if (StartupArgs.Asm_Structure)
- Settings.AsmPrf.Structure = TRUE;
- if (StartupArgs.Asm_Macro)
- Settings.AsmPrf.Macro = TRUE;
-
- if (StartupArgs.Recursively)
- Settings.Recursively = TRUE;
- if (StartupArgs.KeepEmpty)
- Settings.KeepEmpty = TRUE;
- if (StartupArgs.UnrecogAreDocs)
- Settings.UnknownAsAutoDoc = TRUE;
- }
-
- if (StartupArgs.To)
- {
- if (!StartupArgs.From)
- strncpy(DataName, StartupArgs.To, 255);
- else
- LoadData(StartupArgs.To);
- }
-
- if (!StartupArgs.From)
- GoGUI();
- else if (StartupArgs.To)
- {
- /* Expand each wildcard (which can also be just a file)
- * and generate index
- */
- ULONG count;
- STRPTR path;
- struct AnchorPath *fanchor;
-
- if (fanchor = AllocVec(sizeof(struct AnchorPath) + 256, MEMF_CLEAR))
- {
- fanchor->ap_Strlen = 256;
- for (count = 0; path = (*StartupArgs.From)[count]; count++)
- {
- if (!MatchFirst(path, fanchor))
- {
- do
- {
- STRPTR name;
-
- if (name = FullName(fanchor->ap_Buf))
- {
- StartScanning();
- if (fanchor->ap_Info.fib_DirEntryType < 0)
- IndexFile(name, "");
- else
- IndexRecursive(fanchor->ap_Buf, "");
- StopScanning(TRUE);
- FreeVec(name);
- } else
- CloseAll(IoErr());
- } while (!MatchNext(fanchor));
- MatchEnd(fanchor);
- }
- }
- FreeVec(fanchor);
-
- /* Sort the scanned list and save it */
- SortExecList(&FileList, SortCompareFunc, NULL);
- SaveData(StartupArgs.To);
- } else
- CloseAll(ERROR_NO_FREE_STORE);
- } else
- CloseAll(ERROR_REQUIRED_ARG_MISSING);
- } else
- CloseAll(IoErr());
- } else
- CloseAll(ERROR_NO_FREE_STORE);
- }
-
- CloseAll(0);
- }
- ///
- /// CloseAll(LONG error [, STRPTR errtxt])
- void
- CloseAll(LONG error, ...)
- {
- STRPTR errtxt;
- va_list args;
-
- va_start(args, error);
- errtxt = *(STRPTR *)args;
- va_end(args);
-
- FreeFileList();
-
- if (error)
- {
- if (error == ERROR_CUSTOM)
- PostMessage(errtxt);
- else
- {
- UBYTE errortxt[80];
-
- Fault(error, "GenerateIndex", errortxt, 80);
- PostMessage(errortxt);
- }
- }
-
- if (Args)
- {
- FreeArgs(Args);
- FreeDosObject(DOS_RDARGS, Args);
- }
-
- CloseLibrary(&ReqToolsBase->LibNode);
-
- _exit(error ? 5 : 0);
-
- /* Dummy reference; never actually called */
- _waitwbmsg();
- }
- ///
-
- /// LoadSettings()
- void
- LoadSettings(STRPTR file)
- {
- BPTR fil;
-
- if (fil = Open(file, MODE_OLDFILE))
- {
- Read(fil, &Settings, sizeof(Settings));
- Close(fil);
- }
- }
- ///
- /// SaveSettings()
- void
- SaveSettings(STRPTR file)
- {
- BPTR fil;
-
- if (fil = Open(file, MODE_NEWFILE))
- {
- Write(fil, &Settings, sizeof(Settings));
- Close(fil);
- }
- }
- ///
-
- /// PostMessage() - does its best to get a message through to the user
- void
- PostMessage(STRPTR fmt, ...)
- {
- static struct EasyStruct msgreq = {
- sizeof(struct EasyStruct),
- 0,
- "GenerateIndex " VERSION " by Anders Melchiorsen",
- NULL,
- "Okay"
- };
-
- va_list args;
-
- msgreq.es_TextFormat = fmt;
- va_start(args, fmt);
-
- /* Use a requester if the GUI is active */
- if ((_WBMsg) || (!StartupArgs.From))
- {
- if (ReqToolsBase)
- rtEZRequestA(fmt, "Okay", NULL, args, NULL);
- else
- EasyRequestArgs(NULL, &msgreq, NULL, args);
- }
- else
- {
- /* Print in Shell window */
- VPrintf(fmt, args);
- PutStr("\n");
- }
-
- va_end(args);
- }
- ///
-
- /// chkabort() -- disable DICE ^C check
- void
- chkabort(void)
- {
- return;
- }
- ///
-